package com.wangyf.thread.c_013_fair;

import java.util.concurrent.locks.ReentrantLock;

/**
 * 测试公平锁和非公平锁
 * @author wangyf
 * @date 2021/1/3 22:47
 * 发现公平锁在某些情况下无法做到绝对公平
 * 比如下面如果不睡一会，那么有可能 t1在获取锁到释放锁中间 t2未能获取到CPU的一点时间无法加入到 lock的队列中
 * ReentrantLock设置为公平锁之后，会有一个队列，某个线程获取锁如果没有获取到的话会加入到队列中，这个锁解开以后会从队列中取第一个线程执行，
 * synchronized只有非公平锁，非公平锁是哪个线程抢到就是哪个线程执行
 */
public class T {
    private static ReentrantLock lock = new ReentrantLock(true);
    void run() {
        for (int i = 0; i < 100; i++) {
            try {
                lock.lock();
                // 如果不加睡眠可能不是 0 1 0 1 原因是假如这个线程执行完一次中间t2线程没能获取CPU的资源，那么CPU也不能获取到下次的锁
                Thread.sleep(1);
                System.out.println(Thread.currentThread().getName()+"获取了锁");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }

    public static void main(String[] args) {
        T t  = new T();
        new Thread(t::run).start();
        new Thread(t::run).start();
    }
}
